package unmsm.eapisw.taller.srh_presentacion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import unmsm.eapisw.taller.srh_persistencia.modelo.Administrador;
import unmsm.eapisw.taller.srh_persistencia.modelo.Hotel;
import unmsm.eapisw.taller.srh_persistencia.modelo.Permisos;
import unmsm.eapisw.taller.srh_persistencia.modelo.Usuario;
import unmsm.eapisw.taller.srh_servicio.IAdministradorServicio;
import unmsm.eapisw.taller.srh_servicio.IPermisosServicio;
import unmsm.eapisw.taller.srh_servicio.IUsuarioServicio;

@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean implements Serializable{
	private static final long serialVersionUID = -2755140354203386868L;
	private String id;
	private String usuario;
	private String nombre;
	private String password;
	private String correo;
	private List<Permisos> permisos = new ArrayList<Permisos>();
	private Usuario objusuario;

	
	@ManagedProperty(value="#{usuarioService}")
	IUsuarioServicio usuarioService;
	
	@ManagedProperty(value="#{navigationBean}")
    private NavigationBean navigationBean;
	
	@ManagedProperty(value="#{permisosService}")
	IPermisosServicio permisosService;
	
	
	public List<Permisos> getPermisos() {
		return permisos;
	}
	public Usuario getObjusuario() {
		return objusuario;
	}

	public void setObjusuario(Usuario objusuario) {
		this.objusuario = objusuario;
	}
	public void setPermisos(List<Permisos> permisos) {
		this.permisos = permisos;
	}
	private boolean loggedIn;
	
	public IPermisosServicio getPermisosService() {
		return permisosService;
	}

	public void setPermisosService(IPermisosServicio permisosService) {
		this.permisosService = permisosService;
	}

	public boolean isLoggedIn() {
		return loggedIn;
	}

	public void setLoggedIn(boolean loggedIn) {
		this.loggedIn = loggedIn;
	}
	
	public IUsuarioServicio getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(IUsuarioServicio usuarioService) {
		this.usuarioService = usuarioService;
	}

	public NavigationBean getNavigationBean() {
		return navigationBean;
	}

	public void setNavigationBean(NavigationBean navigationBean) {
		this.navigationBean = navigationBean;
	}
	
	 public String logout() {
	        loggedIn = false;	         
	        // Set logout message
	        FacesContext context = FacesContext.getCurrentInstance();
//	        FacesMessage msg = new FacesMessage("Logout success!", "INFO MSG");
//	        msg.setSeverity(FacesMessage.SEVERITY_INFO);
//	        context.addMessage(null, msg);
	         //////////
	        ExternalContext externalContext = context.getExternalContext();
	        Object session = externalContext.getSession(false);
	        HttpSession httpSession = (HttpSession) session;
	        httpSession.invalidate();
	        
	        return navigationBean.toLogin();
	
	    }

	public String ingresar(){

		objusuario = usuarioService.getUsuarioById(usuario, password);
    	
    	if(objusuario==null){

    		limpiar();
    		// Set login ERROR
            FacesMessage msg = new FacesMessage("Login error!", "ERROR MSG");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null, msg);
             
            // To to login page
            return navigationBean.toLogin();
    	}else{

    		
    		password = null;
    		nombre = objusuario.getNombre();
    		id = ""+objusuario.getId();
    		loggedIn = true;
    		getPermisos(objusuario.getId());
            return navigationBean.redirectToWelcome(objusuario.getTipo(), objusuario.getCambiopass());
    	}
		
	}
	
	public void limpiar(){
		usuario = "";
		nombre="";
		password="";
		correo="";
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getCorreo() {
		return correo;
	}
	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public void getPermisos(int idUsuario){
		Set<Permisos> psos = usuarioService.getPermisosByIdUser(idUsuario);
		Permisos p = null;
		Iterator it = psos.iterator();
		while (it.hasNext()) {
			p = (Permisos) it.next();

			permisos.add(p);
		}
	}
}
